<?php

namespace App\Http\Controllers\App;

use App\Models\Lines;
use App\Models\Queue;
use App\Models\Wares;
use App\Models\User;
use App\Models\FlowIn;
use App\Models\LinesLog;
use App\Models\ExChange;
use App\Models\ShopUserCenter;
use App\Models\ShopUserBalanceLog;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class LinesController extends Controller
{
    /**
     * 队列列表(GET) api/lines/list
     */
    public function list(Request $request) 
    {   
        // 用户
        $user_id = session('user_id');
        if(!$user_id){
            return $this->error('未登录');
        }  

        // 获取绑定店铺下的商品列表
        $goods = Lines::where('user_id',$user_id)
                ->where('status','!=',0)
                ->paginate(10);

        return self::json($goods,'成功');
    }

    /**
     * 订单详情(GET) api/lines/info
     */
    public function info(Request $request)
    {   
        // 商品id
        $order_id = $request->input('order_id');
        if(!$order_id){
            return $this->error('订单参数有误');
        }

        // 获取商品详情
        $info = Lines::where('order_id',$order_id)->first();

        if($info){
            return self::json($info,'成功');
        }else{
            return $this->error('订单不存在');
        }
    }

    /**
     * 购买商品(POST) api/lines/buy
     * 
     * @param int   queue           队列id
     * @param str   goods           购买的商品
     * @param int   total_amount    订单总额
     *
     * return order_id  订单号
     * return money     订单金额
     */
    public function buy(Request $request)
    {
        // 测试数据
        // $request->session()->put('user_id',1);

        // 用户
        $user_id = session('user_id');
        if(!$user_id){
            return $this->error('未登录');
        } 

        // 用户信息
        $user_info = User::where('id',$user_id)->select('user_name','real_name')->first();

        // 查询队列信息
        $queue_info = Queue::where('id',$request->input('queue',0))->first();
        if(!$queue_info || $queue_info['status'] == 2){
            return $this->error('队列已关闭');
        }

        // 商品参数整理
        $goods_arr = array_filter(explode(',', $request->input('goods','')));
        // 测试数据
        // $goods_arr = [1,2,3,4];

        // 订单商品总额
        $total_amount = Wares::whereIn('id',$goods_arr)->sum('sell_price');
        if($total_amount != $request->input('total_amount','0')){
            return $this->error('支付金额错误');
        }

        // 订单商品成本总额
        $cost_amount = Wares::whereIn('id',$goods_arr)->sum('cost_price');

        // 订单利润 = 订单总额 - 订单总成本
        $order_profit = $total_amount - $cost_amount;

        // 后台设置项过滤
        // 一，商户最低消费
        if($total_amount<$queue_info['min_amount']){
            return $this->error('消费金额过低');
        }

        // 二，商户最高消费
        if($total_amount>$queue_info['max_amount']){
            return $this->error('消费超出上线');
        }

        // 三，商户用户队列间隔
        if($queue_info['spec']>0){

            // 用户上一订单所在的排序
            $max_u_id   = Lines::where('user_id',$user_id)->max('displayorder');

            // 已有订单
            if($max_u_id>0){

                // 队列最大订单排序
                $max_q_id   = Lines::where('queue',$queue_info['queue'])->max('displayorder');

                // 上一订单距离当前订单的间距
                $juli = $max_q_id + 1 - $max_u_id;

                if($juli<=$queue_info['spec']){
                    return $this->error('参与过于频繁，稍后重试');
                }
            }
        }

        // 四，商户最大总交易额 -- 后台控制
        if($queue_info['max_total_amount']>0){

            $total_volume  = Lines::where('queue',$queue_info['id'])->where('status','!=','0')->sum('money');

            if($total_volume>=$queue_info['max_total_amount']){
                return $this->error('商户交易额已达上限，请联系店铺');
            }
        } 

        // 五，商户最大交易单数 -- 后台控制
        if($queue_info['max_total_order']>0){

            $total_order = Lines::where('queue',$queue_info['id'])->where('status','!=','0')->count();

            if($total_order>=$queue_info['max_total_order']){
                return $this->error('商户交易订单已达上限，请联系店铺');
            } 
        }

        // 当日时间开始结束节点
        $t     = time();
        $start = mktime(0,0,0,date("m",$t),date("d",$t),date("Y",$t));
        $end   = mktime(23,59,59,date("m",$t),date("d",$t),date("Y",$t));

        // 六，用户当日订单限制 -- 后台控制
        if($queue_info['user_day_order']>0){

            // 用户当日订单数
            $user_day_order = Lines::where('user_id',$user_id)
                            ->where('status','!=','0')
                            ->whereBetween('pay_time',[$start,$end])
                            ->count();
                            
            if($queue_info['user_day_order']<=$user_day_order){
                return $this->error('本地订单已达上限，请明天再来');
            }
        }

        // 七，店铺当日订单总额
        $day_amount = Lines::where('delivery_point',$queue_info['shop_id'])
                    ->where('status','!=','0')
                    ->whereBetween('pay_time',[$start,$end])
                    ->sum('money');

        if($queue_info['day_amount']<=$day_amount){
            return $this->error('商户今日交易额已达上限，请明天再来');
        }

        // 生成订单
        $lines = new Lines;
        $lines->queue           = $queue_info['id'];                   // 队列id
        $lines->order_id        = $this->makeOrder($user_id);          // 订单号
        $lines->user_id         = $user_id;                            // 用户id
        $lines->phone           = $user_info['user_name'];             // 手机号
        $lines->username        = $user_info['real_name'];             // 联系人
        $lines->goods           = $request->input('goods','');         // 购买的商品
        $lines->money           = $total_amount;                       // 消费总金额
        $lines->order_profit    = $order_profit;                       // 订单产生的利润
        $lines->take_no         = rand(1000,9999).chr(rand(65,90));    // 提货码
        $lines->delivery_point  = $queue_info['shop_id'];              // 提货点

        $re = $lines->save();
        if($re){
            $data = [
                'order'         => $lines->order_id,
                'pay_amount'    => (string)$lines->money
            ];
            return $this->json($data,'下单成功');
        }else{
            return $this->error('下单失败');
        }


    }

    /**
     * 消费付款(POST) api/lines/pay
     */
    public function pay(Request $request)
    {

        // 测试数据
        // $request->session()->put('user_id',14);

        // 参数整理
        $order_id   = $request->input('order_id');      // 订单号
        $money      = $request->input('money');         // 支付金额
        $pay_type   = $request->input('pay_type');      // 支付方式 1支付宝 2微信 3余额
        $passwd     = $request->input('passwd');        // 支付密码 当值为“mianmi”表示不使用支付密码  其余表示密码串 

        // 验证用户是否登陆
        $user_id = session('user_id');
        if(!$user_id){
            return $this->error('未登录');
        }

        // 订单有效性验证
        $order_info = $this->order_info($order_id);
        if(!$order_info || $order_info['status'] != 0){
            return $this->error('订单信息有误');
        }

        // 用户资金信息
        $balance_info = ShopUserCenter::where('user_id',$user_id)->where('status',1)->first();
        if(!$balance_info){
            return $this->error('与店铺无绑定关系');
        }

        // 余额是否充足
        if($order_info['money'] > $balance_info['balance']){
            return $this->error('余额不足',310);
        }

        // 参数金额是否与订单金额相等
        if($money != $order_info['money']){
            return $this->error('支付金额错误');
        }

        // 支付方式
        if($pay_type ==1){

            return $this->error('支付宝支付服务未开启');

        }elseif($pay_type == 2){

            return $this->error('微信支付服务未开启');

        }elseif($pay_type == 3){

            // 非免密支付下判断支付密码是否正确
            if($passwd != 'mianmi'){
                // 支付密码支付
                $userinfo = User::where('id', $user_id)->first();

                $res = User::check_pwd($passwd, $userinfo['pay_pwd']);
                if(!$res){
                    return $this->error('支付密码错误',308);
                }
            }

            // 扣除余额
            $re_pay = ShopUserCenter::where('user_id',$user_id)
                    ->where('id',$balance_info['id'])
                    ->update(['balance'=>$balance_info['balance']-$money]);
            if($re_pay){
                $this->succ($order_id , $pay_type);
            }else{
                return $this->error('扣除余额报错');
            }

        }else{

            return $this->error('错误的支付方式');

        }
        return $this->error('付款成功',200);
    }

    /**
     * 测试业务逻辑
     */
    public function test()
    {
        $this->succ('8095215111KOZM','0','');
    }

    /**
     * 支付成功后业务逻辑处理
     */
    public function succ($order_id , $pay_type=0 , $order_no='')
    {
        // 订单状态判断
        $order_info = $this->order_info($order_id);
        if($order_info['pay_status'] == 1){
            return ;
        }

        // 用户手机号
        $user_mobile = User::where('id' , $order_info['user_id'])->value('user_mobile');

        // 写入交易流水日志
        $balance_log = new ShopUserBalanceLog;
        $balance_log->user_id       = $order_info['user_id'];           // 用户id
        $balance_log->shop_id       = $order_info['delivery_point'];    // 商户id
        $balance_log->order_sn      = $order_info['order_id'];          // 订单id
        $balance_log->money         = $order_info['money'];             // 变动金额
        $balance_log->type          = 1;                                // 交易类型 -- 消费付款
        $balance_log->action_type   = 1;                                // 行为类型 -- 用户支出
        $balance_log->status        = 2;                                // 日志状态 -- 审核通过
        $balance_log->user_mobile   = $user_mobile;                     // 用户手机号
        $balance_log->note          = "购买商品消费";                   // 日志
        $balance_log->save();

        // 获取该队列最大排序
        $max_display = Lines::where('queue',$order_info['queue'])->max('displayorder');

        // 更改订单状态
        $ok = Lines::where('order_id',$order_info['order_id'])
            ->update([
                'pay_status'        => 1,
                'status'            => 1,
                'displayorder'      =>$max_display+1, 
                'draworder'         =>$max_display+1, 
                'pay_time'          =>time(), 
                'pay_way'           =>$pay_type,
            ]);

        // 可分发的利润
        $pro_money = $order_info['order_profit'];

        // 初始化
        $pro_log = array();
        $help_order = '';

        // 利润分配
        do{
            // 寻找受益人
            $pro_info = Lines::where('status',1)
                        ->where('order_id','!=',$order_id)
                        ->where('queue',$order_info['queue'])
                        ->where('displayorder','<',$max_display+1)
                        ->orderBy('displayorder','asc')
                        ->first();
            if(!$pro_info){
                // 无受益人状态 将钱打入商户收益 -- 利润商户溢出收益
                $flow_in = new FlowIn;
                $flow_in->order_id  = $order_id;                        // 收益溢出来源订单
                $flow_in->money     = $pro_money;                       // 溢出金额
                $flow_in->shop_id   = $order_info['delivery_point'];    // 商户id
                $flow_in->note      = "溢出收益";                       // 记录日志
                $flow_in->save();

                // 跳出循环
                break;
            }

            // 获益的订单编号
            $help_order .= $pro_info['order_id'].',';

            // 用户剩余收益 = 待返金额 - 已收益金额
            $need = $pro_info['money'] - $pro_info['proceeds'];

            // 初始化变量 -- 获取的收益
            $get_pro = 0;

            if($pro_money>=$need){
                // 本次获取的收益
                $get_pro = $need;

                // 获益后直接出局
                $re_pay_pro = Lines::where('order_id',$pro_info['order_id'])
                            ->update([
                                'proceeds'  => $pro_info['proceeds']+$need, 
                                'status'    =>2 , 
                                'out_time'  =>time()
                            ]);

                // 获益用户出单总数
                $pro_count = Lines::where('user_id',$pro_info['user_id'])
                            ->where('status','>',1)
                            ->count();

                // 转为强制消费积分
                if($pro_count>0 && $pro_count%6==0){

                    // 用户当前强制积分
                    $points = ShopUserCenter::where('user_id',$pro_info['user_id'])->value('point_1');

                    // 为用户添加强制积分
                    $re_p = ShopUserCenter::where('user_id',$pro_info['user_id'])
                            ->update(['point_1'=>$pro_info['money']+$points]);

                    // 用户手机号
                    $user_mobile = User::where('id' , $pro_info['user_id'])->value('user_mobile');

                    // 写入交易流水日志(强制积分收益)
                    $balance_log = new ShopUserBalanceLog;
                    $balance_log->user_id       = $pro_info['user_id'];         // 用户id
                    $balance_log->shop_id       = $pro_info['delivery_point'];  // 商户id
                    $balance_log->order_sn      = $pro_info['order_id'];        // 订单id
                    $balance_log->money         = $pro_info['money'];           // 变动金额
                    $balance_log->type          = 6;                            // 交易类型 -- 转为强制消费积分
                    $balance_log->action_type   = 2;                            // 行为类型 -- 用户收入
                    $balance_log->status        = 2;                            // 日志状态 -- 审核通过
                    $balance_log->user_mobile   = $user_mobile;                 // 用户手机号
                    $balance_log->note          = "队列出局，转为强制消费积分"; // 日志
                    $balance_log->save();

                }else{

                    // 队列配置详情
                    $queue_info = Queue::where('id',$pro_info['queue'])->first();

                    // 系统自动发起兑换申请
                    $exchange = new ExChange;
                    $exchange->userid           = $pro_info['user_id'];                                 // 用户
                    $exchange->order_id         = $pro_info['order_id'];                                // 订单号
                    $exchange->shop_id          = $pro_info['delivery_point'];                          // 商户id
                    $exchange->total            = $pro_info['money'];                                   // 订单总额
                    $exchange->actual           = $pro_info['money'] * (1-$queue_info['poundage']/100); // 实际获得
                    $exchange->poundage         = $pro_info['money'] * $queue_info['poundage'] / 100;   // 利润 -- 金额
                    $exchange->percent          = $queue_info['poundage'].' %';                         // 利润 -- 百分比
                    $exchange->save();
                }

                // 剩余利润
                $pro_money = $pro_money-$need;      
            }else{
                // 本次获取的收益
                $get_pro = $pro_money;

                // 获益后继续排队中
                $re_pay_pro = Lines::where('order_id',$pro_info['order_id'])
                            ->update([
                                'proceeds'  =>$pro_info['proceeds'] + $pro_money,
                            ]);

                // 利润清零
                $pro_money = 0;
            }

            // 收益日志
            $pro_log[] = [
                'order_id'      => $pro_info['order_id'],
                'queue'         => $pro_info['queue'],
                'type'          => 1,                               // 类型 0付款 1队列助推 2分润助推 3其他
                'help_order'    => $order_info['order_id'],         // 获益来源
                'help_money'    => $get_pro,                        // 获益金额
                'log'           => "获得收益".$get_pro." 积分",
                'created_at'    => date("Y-m-d H:i:s"),
                'updated_at'    => date("Y-m-d H:i:s")
            ];

        }while($pro_money>0);

        // 付款用户队列日志
        $lines_log = new LinesLog;
        $lines_log->order_id    = $order_info['order_id'];                                  // 订单id
        $lines_log->queue       = $order_info['queue'];                                     // 队列id
        $lines_log->type        = 0;                                                        // 类型 0付款 1队列助推 2分润助推 3其他
        $lines_log->help_order  = $help_order;                                              // 助推的订单
        $lines_log->help_money  = $order_info['order_profit'];                              // 分发的总利润
        $lines_log->log         = '付款成功';                                               // 文本日志
        $lines_log->save();

        // 获益用户收益日志入库
        $res = Lineslog::insert($pro_log);
       

    }

    /**
     * 生成订单号
     */
    private function makeOrder($user_id)
    {
        // 使用用户id组合7位随机字符串，追加到订单号后面
        $len = 7 - strlen($user_id);
        $pre = '';
        for($i=1 ; $i<=$len ; $i++){
            $pre .= chr(rand(65,90));
        }
        $order_suf = $user_id.$pre;
        
        // 返回订单编号
        return substr(time(),3,8).$order_suf;
    }

    /**
     * 订单详情
     */
    private function order_info($order_id)
    {
        return Lines::where('order_id',$order_id)->first();
    }

    /**
     * 数据处理
     */
    private function dealData($data)
    {
        return $data;
    }

    /**
     * 计划任务助推测试(GET) api/lines/testass
     * @param double    money       助推总额
     * @param int       shop_id     商户id
     * @param int       user_id     用户id ， 没有值为0
     * @param string    order_sn    助推来源订单号
     */
    public function testass()
    {
        Lines::assist('202' , 0 , 17 , '151596439623572');
    }


    


}